import math
from time import time

# 输入一个字符串，输出最后一个单词的长度
def 任务2():
    print('请输入一句话，英文')
    str = input('>>>')
    s_pos = str[-1::-1].find(' ')
    if s_pos == -1:
        s_pos = 0
    print(len(str[-s_pos:]))

# 有1、2、3、4个数字，能组成多少个互不相同且无重复数字的三位数？都是多少？
def 任务3():
    print("四兄弟结果如下~")
    num = 0 # 4x3x2
    for i in range(1, 5):
        for j in range(1, 5):
            for k in range(1, 5):
                if(i != j and i != k and j != k):
                    print(i*100+j*10+k)
                    num += 1
    print (num)

# 一个整数，它加上100后是一个完全平方数，再加上168又是一个完全平方数，请问该数是多少？[-99,10000]
def 任务4():
    print('无论是加100，还是再加168，我都是完全平方数')
    for i in range(-99,10001):
        a = i+100
        b = i+268
        c = math.sqrt(a)
        d = math.sqrt(b)
        if(a%c == 0 and b%d == 0):
            print(i)

# 打印出所有的“水仙花数” ，所谓“水仙花数”是指一个三位数，其各位数字立方和等于该数本身。
def 任务5():
    print('水仙花数[100,999]')
    for i in range(100, 1000):
        a = int(i/100)
        b = int(i/10 % 10)
        c = i % 10
        if(a**3+b**3+c**3 == i):
            print(i)

# 输入两个整数，求最大公因数
def 任务6():
    print('最大公因数')
    a = inNum()
    b = inNum()
    for i in range(min(a,b),0,-1):
        if(a%i == 0 and b%i == 0):
            print(i)
            return
    print("是整数哦~")

# 识别数字，包括小数，不包括负数，并将输入的数字自动转化为相应类型
def inNum():
    while (True):
        try:
            n = input(">>>")
            if n.isdigit():
                return int(n)
            else:
                p_dot = n.find('.')
                if n[:p_dot].isdigit() and n[p_dot + 1:].isdigit():
                    return float(n)
        except ValueError as value_err:
            print("输入一个数字！")
            continue

# 购买：按照商品编号，返回相对应的产品信息，加入购物车
def shop_buy(data):
    list = []
    while(True):
        print("请输入想购买的商品编号\t/ #-终止操作")
        a = input('>>>')

        if(a == '#'):
            break
        for i in data:
            if (i == a):
                print('<', data[i]['名称'], '\t', data[i]['价格'], '>\n')
                list.append(i)
    print(list)
    return list

# 总类查看：
def shop_list(data):
    print("\n<<<<<<<<<-<<<<<<<<<商品总类>>>>>>>>>->>>>>>>>>")
    for i in data:
        if (len(data[i]['名称']) < 4):
            print('\t', i, '\t', data[i]['名称'], '\t\t', data[i]['价格'])
        else:
            print('\t', i, '\t', data[i]['名称'], '\t', data[i]['价格'])
    print("<<<<<<<<<-<<<<<—<<<<<——>>>>>—>>>>>->>>>>>>>>\n")

# 清单内容删除
def del_list(data, list):
    while True:
        a = 0
        delist = {}
        print("\n<<<<<<<<<-<<<<<<<<<商品清单>>>>>>>>>->>>>>>>>>")
        for i in list:
            if (len(data[i]['名称']) < 4):
                print(a, '\t', i, '\t', data[i]['名称'], '\t\t', data[i]['价格'])
            else:
                print(a, '\t', i, '\t', data[i]['名称'], '\t', data[i]['价格'])
            delist[a] = i
            a += 1
        print("<<<<<<<<<-<<<<<—<<<<<——>>>>>—>>>>>->>>>>>>>>\n")

        print("请输入您要删除的商品号码\t/ #-结束操作")
        b = input()
        try:
            list.remove(delist[int(b)])
            print('删除成功')
        except:
            print('删除失败，无交易信息')

        if(b == '#'):
            return list

# 打印购买清单：
def buy_list(data, list, pre, gold):
    flag = 1
    while(True):
        print("\n<<<<<<<<<-<<<<<<<<<购物清单>>>>>>>>>->>>>>>>>>")
        if (flag == 1):
            sum = 0  # 用于记录商品总金额
            flag = 1  # 用于标记优惠券状态
            prelist = [((0, 0), 0)] # 初始优惠信息化列表
            for i in list:
                sum += float(data[i]['价格'])
                if (len(data[i]['名称']) < 4):
                    print('\t', i, '\t', data[i]['名称'], '\t\t', data[i]['价格'])
                else:
                    print('\t', i, '\t', data[i]['名称'], '\t', data[i]['价格'])
            print("合计消费：\t%.2f元" % sum)

            prelist += pre_list(sum, pre)

        try:
            prenow = float(prelist[flag][1])
        except:
            flag = 0
            prenow = float(prelist[flag][1])

        print("当前优惠：\t%.2f元" % (prenow))
        if (prelist[flag][0][1] > 400000):
            print('所用优惠券：\t满%.2f元享%d折' % (prelist[flag][0][0], (prelist[flag][0][1]-400000)*100))
        else:
            print('所用优惠券：\t满%.2f元减免%.2f元' % (prelist[flag][0][0], prelist[flag][0][1]))

        endpay = (sum - prenow)

        print("最终消费：\t%.2f元" % endpay)
        print("<<<<<<<<<-<<<<<—<<<<<——>>>>>—>>>>>->>>>>>>>>\n")

        print('\t / 1-更换优惠券 2-确认付款')
        b = inNum()
        c = 0
        if (b == 1):
            for i, j in prelist:
                if (i[1] > 400000):
                    print('\t', c, '\t优惠券：满%.2f元享%d折' % (i[0], (i[1] - 400000) * 100), '\t', '最大优惠：%.2f元' % j)
                elif (i[1] <= 400000 and i[1] != 0):
                    print('\t', c, '\t优惠券：满%.2f元减免%.2f元' % (i[0], i[1]), '\t', '最大优惠：%.2f元' % j)
                c += 1
            print("请输入您想要替换的优惠券编号")
            flag = inNum()
        elif(b == 2):
            if gold >= endpay:
                return [gold - endpay, prelist[flag][0], list]
            else:
                print("商品购买失败，差%.2f元" % (endpay - gold))
                list = del_list(data, list)

# 优惠券：自动选择最大优惠的方案
def pre_list(sum, pre):
    pre = sorted(pre.items(), key=lambda x: x[0], reverse=True)
    list = {}
    for i in pre:
        if(i[0] < sum):
            if(i[1] > 400000):
                best_pre = (1-(i[1]-400000))*sum
            else:
                best_pre = i[1]
            list[i] = best_pre
    list = sorted(list.items(), key=lambda x: x[0], reverse=True)
    return list

def shop():
    from openpyxl import Workbook, load_workbook

    gold = 1000

    wb = Workbook() # 该方法主要用于创建一个新的
    wb = load_workbook('./2.xlsx')  # 该方法主要用于导入一个已经存在的工作薄
    sheet = wb["Sheet1"]   # 读入工作簿内所有内容

    data = {}
    buyList = []
    # 通过字典存储优惠券表单，key为使用条件，value为优惠价值
    preList = {168: 10, 20: 4, 120: 8, 80: 5, 3: 2.99, 200: 400000.87 }
    # 按照键值从大到小排序
    # sorted(preList.values(), reverse=True)

    for row in sheet:
        data[row[2].value] = {'名称': row[0].value, '价格': row[1].value}

    while(True):
        print('你想干什么？\t/ 1-购物 2-商品总类 3-购物清单')
        print('账户余额:%.2f元' % gold)
        a = inNum()
        if (a == 1):
            buyList = shop_buy(data)
        elif (a == 2):
            shop_list(data)
        elif (a == 3):
            templist = buy_list(data, buyList, preList, gold)
            print(templist)
            try:
                del preList[templist[1][0]]
            except:
                pass
            gold = templist[0]
            buyList = templist[2]
        else:
            break

# 界面
def UI():

    t = time()

    print("你想干什么？")
    print("> 1 —— 网上商城")
    print("> 2 —— 末位单词长度")
    print("> 3 —— 三兄弟")
    print("> 4 —— 完全平方数plus")
    print("> 5 —— 水仙花数")
    print("> 6 —— 最大公因数")
    print('# 请输入上述数字，随后你懂得~')
    flag = input(">>")

    print('\n\n\n\n\n\n\n\n\n\n\n\n\n') #假装清屏
    switch.get(flag)()  # 执行对应的函数，如果没有就执行默认的函数
    print('\n——执行完成/所用时间:%fs' % (time() - t))
    input('---------按任意键继续......')

# 假借字典实现switch引索
switch = {
    '1' : shop,          # 网上商城
    '2' : 任务2,          # 末位单词长度
    '3' : 任务3,          # 三兄弟
    '4' : 任务4,          # 完全平方数plus
    '5' : 任务5,          # 水仙花数
    '6' : 任务6,          # 最大公因数
}

while True:
    UI()
